from random import choice, shuffle
SH = '\\'
ALPHABET = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
FILEPATH = r'singular.txt'


def hung(oops):     #функция рисования состояния виселицы
    print(f'''
          _______
          |/    {'|' if oops > 0 else ' '}
          |     {'O' if oops > 1 else ' '}
          |    {'/' if oops > 2 else ' '}{'|' if oops > 3 else ' '}{SH if oops > 4 else ' '}
          |\   {'/' if oops > 5 else ' '} {SH if oops > 6 else ' '}
          |_\___
        
          ''')


def create_list_words() -> list:        #Создание списка угадываемых слов
    words = []
    file = open(FILEPATH, encoding='utf-8')
    for line in file:
        line = line.upper().strip()
        if len(line) >= 5:
            rus_word = True
            for x in line:
                if x not in ALPHABET:
                    rus_word = False
            if rus_word:
                words.append(line)
    file.close()
    if len(words) == 0:
        print('В файле нет ни одного слова.')
        print('Нажмите ENTER для выхода')
        exit()
    shuffle(words)
    return words


def yes_or_no()  -> bool:       #Функция выбора "Да" или "Нет"
    flag = True
    result = True
    while flag:
        vvod = input('"Да" или "Нет" : ').lower()
        if vvod == 'да':
            break
        elif vvod == 'нет':
            result = False
            flag = False
        else:
            print('Определитесь с выбором: "Да" или "Нет"!')
    return result


def input_char(input_simvol) -> str:    #Ввод символа и его проверка на повторный ввод и на русскоязычность
    flag = True
    while flag:
        char = input('Введите букву: ').upper()
        if len(char) > 1:
            print('Вводите одну букву!')
        elif char not in ALPHABET:
            print('Введите букву русского алфавита!')
        elif char in input_simvol:
            print('Такую букву уже вводили. Введите новую!')
        else:
            input_simvol.append(char)
            flag = False
    return char


def replace_mask(mask, char, word):     #Функция изменения маски угадываемого слова если введенная буква есть в слове
    res = ''
    for i in range(len(mask)):
        if word[i].lower() == char.lower():
            res += char
        else:
            res += mask[i]
    return res


def restart_game(words_list):       #Функция перезапкуска раунда игры
    word = choice(words_list)
    print()
    print(f'Слово загадано! Его длина: {len(word)} букв.')
    mask = '*' * len(word)
    input_simvol = []
    mistakes = 0
    return word, mask, input_simvol, mistakes


def print_round(mask, input_simvol, mistakes):      #Функция отображения состояния игры на экране
    print()
    print(f'Сейчас угадываемое слово выглядит так: {mask}')
    hung(mistakes)
    print(f'Осталось ошибок: {7 - mistakes}')
    print(f'Введенные ранее буквы: {"-" if len(input_simvol) == 0 else input_simvol}')


def checking_char(char, mask, mistakes, word):      #функция проверки наличия введенного символа в угадываемом слове
    if char in word.upper():
        mask = replace_mask(mask, char, word)
        return mask, mistakes
    else:
        print(f'Буквы {char.upper()} нет в загаданном слове.')
        mistakes += 1
        return mask, mistakes


def end_game(word, mask, mistakes):     #Функция окончания раунда игры
    if mask == word.upper():
        print('Поздравляем! Вы угадали слово. Это действтельно ', word)
        print('Желаете сыграть еще?')
    elif mistakes == 7:
        hung(mistakes)
        print('Вас "повесили"! Загаданное слово было: ', word)
        print('Желаете сыграть еще?')
        

def main():     #Основная функция игры
    words_list = create_list_words()
    print('''              Вас приветствует игра "Виселица"!
            Правила игры просты: отгадайте загаданное слово за 
            отведенное число попыток. Удачи!
          ''')
    print('            Начать новую игру? ', end='')
    while yes_or_no():
        print('Начинаем новый раунд игры "Виселица"! Удачи!')
        word, mask, input_simvol, mistakes = restart_game(words_list)
        while not (word.upper() == mask or mistakes == 7):
            print_round(mask, input_simvol, mistakes)
            char = input_char(input_simvol)
            mask, mistakes = checking_char(char, mask, mistakes, word)
            end_game(word, mask, mistakes)
    print('Игра завершена.')
    input('Нажмите "ENTER" чтобы выйти.')


if __name__ == '__main__':
    main()